use sqlx::{PgPool, Error};
use struct_field_names_as_array::FieldNamesAsSlice;

use crate::core::psqlx_tools::SqlString;
use crate::model::taxon::TaxonModel;
use crate::model::model::Model;
use crate::types::frontend::taxon_type::{TaxonDetail, TaxonRow};

pub struct TaxonService;

impl TaxonService {
    /// 获取分类分页列表
    /// 正确返回 TaxonList 数据，数据包括页码，每页数量，当前页TaxonRow数据数组，总条数
    /// 错误返回 sqlx::Error
    pub async fn get_taxons(db: &PgPool) -> Result<Vec<TaxonRow>, Error> {
        let model = TaxonModel::new();
        
        let sql = SqlString::new(model.table())
        .field_slice(TaxonRow::FIELD_NAMES_AS_SLICE)
        .order_primary_key_desc()
        .select();

        let res = sqlx::query_as::<_, TaxonRow>(&sql)
        .fetch_all(db)
        .await;
        
        res
        
    }

    /// 获取分类详情
    /// 参数 id 分类id
    /// 正确返回 TaxonForm 表单数据
    /// 错误返回 sqlx::Error
    pub async fn get_taxon_by_id(db: &PgPool, id: i64) -> Result<TaxonDetail, Error> {
        let model = TaxonModel::new();
        let sql: String = SqlString::new(model.table())
        .field_slice(TaxonDetail::FIELD_NAMES_AS_SLICE)
        .append_primary_key()
        .where_primary_key()
        .select();

        let res = sqlx::query_as::<_, TaxonDetail>(&sql)
        .bind(id)
        .fetch_one(db)
        .await;
        res
    }
}
    